#ifndef __DY_H_
#define __DY_H_

#include <cstddef>
#include <iostream>
#include <limits.h>
#include <cmath>

using ElementType = void*;

class Dy
{
public:  
    Dy();
    Dy(const Dy& a);
    Dy& operator=(const Dy& a);
    ~Dy();

    void SetFree(void (*Free)(void *))
    {
        this->Free = Free;
    }
    void SetPrint( void (*Print)(void *))
    {
        this->Print = Print;
    }
    void SetCompare (int (*Compare)(void * ,void *))
    {
        this->Compare = Compare;
    }
    void SetComepare1 (bool (*Compare1)(ElementType element1 ,ElementType element2))
    {
        this->Compare1 = Compare1;
    }
    //插入
    //尾插法
    void InsertTail(const ElementType& element);
    //头插法
    void InsertHead(const ElementType& element);
    //中间插入
    void InserByIndex(const ElementType& element,size_t index);
    
    //删除
    //按位置删除
    void RemoveByIndex(size_t index);
    //按值删除
    void RemoveByElement(const ElementType& element);
    
    //查找
    //按位置查找
    ElementType* FindByIndex(size_t index);
    //按值查找
    Dy FindByElement(const ElementType& element);
    
    //修改
    //按位置修改
    void UpdateByIndex(size_t index,const ElementType& newvalue);
    //按值修改
    void UpdateByElement(const ElementType& oldvalue,const ElementType& newvalue);
    //合并  归并排序   两个有序数列，合并成一个新的有序数列
    Dy Merge(const Dy& a);
    ElementType& operator[](int index);//查找和修改

    //排序算法
    void Sort();
    //去重算法
    void Duplicate();
    //取交集
    Dy FdIntrSctn(const Dy& a);
    //取并集
    Dy FindUnionSet(const Dy& a);
    //取补集
    Dy FindDifference(const Dy& a);
    
    //判断两个数列是否相等
    bool operator==(const Dy& a);

    //二分法  没找到返回 ULONG MAX
    size_t BinarySearch(const ElementType& element);
    //判断一个数列是不是另一个数列的子数列
    bool Contains(const Dy& a);
    //判断一个数列是不是连续子数列
    bool ContnsContains(const Dy& a);
    //获取子序列
    Dy SubSquence(size_t index,size_t len);
    void show();
private:
    //分组函数
    size_t partition(size_t start, size_t end);
    void FastSort(size_t start, size_t end,size_t CurDepth,size_t MaxDepth);//爆栈：递归深度过深，导致栈空间不足
    void InsertSort(size_t start, size_t end);
    void ReSize(size_t capacity);
    ElementType *array;
    size_t capacity;
    size_t size;


    void (*Free)(void *);
    int (*Compare)(void * ,void *);
    void (*Print)(void *);
    bool (*Compare1)(ElementType element1 ,ElementType element2);

};

#endif